//  引入koa
const Koa = require('koa');
const { connectDb, initSchema } = require('./database/init');
const Router = require('koa-router');
const bodyParser = require('koa-bodyparser');
const cors = require('koa2-cors'); // 后端解决跨域的插件


const userRouter = require('./appApi/User');
const goodsRouter = require('./appApi/Goods');
const categoryRouter = require('./appApi/Category');
const categorySubRouter = require('./appApi/Category_sub');
const AddressRouter = require('./appApi/Address');
const CommentRouter = require('./appApi/Comment');

// 连接数据库,立即执行函数
(async () => {
  await connectDb();
  initSchema();
})();

// 创建app对象
const app = new Koa();

// 即时通讯
const IO = require('./lib/index');
const chat = new IO( 'chat' );
chat.attach(app);
chat.on( 'connection', ctx => {
  console.log( 'Joining chat namespace', ctx.socket.id )
})
chat.on( 'message', ctx => {
  // 监听客户端并发送响应消息
  console.log( 'chat message received', ctx.data )
  const arrDesc = ['hello', '草', '你好', 'ok', '滚犊子', ctx.data];
  const randomIndex = Math.ceil(Math.random() * 5);
  ctx.socket.emit( 'message', arrDesc[randomIndex]);
})


// 引入跨域插件,这里如果不配置里面的两个参数，只能保证跨域，但是不能传递cookie，所以要想传递cookie，则需要配置里面的参数
// 而且需要在axios上加上withCredentials: true配置参数（与cookie有关的都需要加上这个配置项）
app.use(cors({
  credentials: true,
  origin: 'http://118.25.208.36',
  // origin: 'http://localhost:8081',
}));
// 引入bodyParser,要加在路由前面，因为要在路由里解析参数
// 这里的路由要写在总路由器前面，可写在子路由后面
app.use(bodyParser());

// 引入路由
const router = new Router();
// 装载子路由
router.use('/dsSystem/user', userRouter.routes());
router.use('/dsSystem/goods', goodsRouter.routes());
router.use('/dsSystem/category', categoryRouter.routes());
router.use('/dsSystem/categorySub', categorySubRouter.routes());
router.use('/dsSystem/address', AddressRouter.routes());
router.use('/dsSystem/comment', CommentRouter.routes());
// 装载所有的子路由
app.use(router.routes());

// allowedMethods处理的业务是当所有路由中间件执行完成之后,若ctx.status为空或者404的时候,丰富response对象的header头
//当然,如果我们不设置router.allowedMethods()在表现上除了ctx.status不会自动设置,以及response的header中不会加上Allow之外,不会造成其他影响.
app.use(router.allowedMethods());

// 即时通讯
// const server = http.createServer(app.callback());
// const io = socketIo(server);
// io.on('connection', (socket) => {
//   socket.on('chat', (msg) => {
//     console.log(msg);
//     io.on('emit', 'i am' + msg);
//   })
// })
// server.listen(3000, () => {
//   console.log('server is starting 3000');
// })
// 监听应用的端口
app.listen(3000, () => {
  console.log('server is starting 3000');
})


